# -*- coding:utf-8 -*-

import logging
from . import api
from flask import g, jsonify, request, current_app, session
from iHome import db
from iHome import constants
from iHome.models import User
from iHome.utils.response_code import RET
from iHome.utils.common import login_required
from iHome.utils.image_storage import storage


@api.route('/user/auth', methods=["POST"])
@login_required
def set_user_auth():
    """保存用户的实名认证信息"""
    # 1.取出参数并判空
    data_dict = request.json
    real_name = data_dict.get("real_name")
    id_card = data_dict.get("id_card")
    if not all([real_name, id_card]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数错误")
    # 2.取到当前登录用户,并设置数据
    user_id = g.user_id
    try:
        user = User.query.get(user_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="查询用户失败")

    if not user:
        return jsonify(errno=RET.USERERR, errmsg="用户不存在")
    # 3.保存用户的认证信息
    user.real_name = real_name
    user.id_card = id_card
    try:
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg="保存数据失败")
    return jsonify(errno=RET.OK, errmsg="保存认证信息成功", data=user.to_auth_dict())


@api.route("/user/auth", methods=["GET"])
@login_required
def get_user_auth():
    """获取用户的实名认证信息"""
    user_id = g.user_id
    try:
        user = User.query.get(user_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="查询用户失败")

    if not user:
        return jsonify(errno=RET.USERERR, errmsg="用户不存在")
    return jsonify(errno=RET.OK, errmsg="ok", data=user.to_auth_dict())


@api.route('/user/name', methods=['POST'])
@login_required
def set_user_name():
    """
    设置用户名
    1.获取前端提交的数据,并判断数据是否有值
    2.查询出指定user并更新'name'属性
    3.返回修改结果
    :return:
    """
    # 1.获取前端提交的数据,并判断数据是否有值
    json_dict = request.get_json()
    name = json_dict['name']
    if name is None:
        return jsonify(errno=RET.PARAMERR, errmsg='参数错误')
    # 2.查询出指定user并更新'name'属性
    try:
        User.query.filter_by(id=g.user_id).update({'name': name})
        db.session.commit()
    except Exception as e:
        logging.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg='更新数据出错')
    else:
        # 更新session中的用户名
        session['name'] = name
        # 3.返回修改结果
        return jsonify(errno=RET.OK, errmsg='修改成功')


@api.route('/user/avatar', methods=['POST'])
@login_required
def upload_avatar():
    """
    上传用户头像
    1.取到客户端上传的文件,并判断
    2.取到七牛上传的文件
    3.更新当前用户头像地址信息
    4.返回用户头像地址
    :return:
    """

    # 1.取到客户端上传的文件,并判断
    avatar_data = request.files.get('avatar')
    if not avatar_data:
        return jsonify(errno=RET.NODATA, errmsg='请选择头像')
    # 2.使用七牛上传文件
    try:
        image_name = storage(avatar_data.read())
    except Exception as e:
        logging.error(e)
        return jsonify(errno=RET.THIRDERR, errmsg='上传头像失败')
    # 3.更新当前用户头像地址信息
    user_id = g.user_id
    try:
        User.query.filter_by(id=user_id).update({'avatar_url': image_name})
        db.session.commit()
    except Exception as e:
        logging.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg='图片保存失败')
    else:
        avatar_url = constants.QINIU_DOMIN_PREFIX + image_name
        return jsonify(
            errno=RET.OK, errmsg='图片上传成功', data={
                "avatar_url": avatar_url})


@api.route('/user')
@login_required
def get_user_profile():
    """
    获取个人信息
    1.取到当前登录用户id
    2.查询当前登录用户
    3.判断用户是否存在
    4.返回数据
    :return:
    """
    # 取到当前登录用户 id
    user_id = g.user_id
    # 查询当前登录用户
    try:
        user = User.query.filter_by(id=user_id).first()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="数据查询错误")

    # 3.如果用户不存在
    if user is None:
        return jsonify(errno=RET.USERERR, errmsg="用户不存在")
    return jsonify(errno=RET.OK, errmsg="OK", data=user.to_dict())
